// ES5实现继承
function Animal(name){
    this.name=name;
}
// 把共有方法抽离出来写在原型上
Animal.prototype.sayAnimal=function(){
    console.log(' Animal:'+this.name);
}

function Dog(age){
    this.age=age;
}
// 实现继承的关键 把构造函数的原型作为另一个构造函数的实例，本质上重写了原型,所以要把constructor的指向重写回来
Dog.prototype=new Animal("Animal1");
Dog.prototype.constructor=Dog;
// 把共有方法抽离出来写在原型上 但必须在Dog重写原型或继承之后才生效
Dog.prototype.sayDog=function(){
    console.log(' Dog:'+this.age);
}
var dog=new Dog(12);
dog.sayDog();
dog.sayAnimal();

// ES6实现继承
// class 中作为构造函数必须写constructor
class Animal2{
    constructor(name){
        this.name=name;
    }
    // 等同于普通函数中在原型上写方法
    sayAnimal(){
        console.log(" Animal2:"+this.name);
    }
}

// es6继承 必写extends 和super()
// 当父类构造函数中参数时，super()中必须传递参数过去
// 其实这里的extends和super(name)就是等同于 Dog.prototype=new Animal("Animal1"); 要执行一遍父类的构造函数才能真正实现继承
class Dog2 extends Animal2{
    constructor(name,age){
        super(name);
        this.age=age;
    }
    // 等同于Dog.prototype.sayDog=function(){...}
    sayDog(){
        console.log(" Dog2:"+this.age);
    }
}

var dog2=new Dog2("Animal2",22);
dog2.sayDog();
dog2.sayAnimal();